package cn.tworice.cryption.service.impl;


import cn.tworice.cryption.config.CryptionProperties;
import cn.tworice.cryption.service.CryptService;
import cn.tworice.cryption.util.AesGcmUtil;
import cn.tworice.cryption.util.RSAUtil;

import java.security.KeyPair;

/**
 * RSA+AES混合加密解密
 */
public class RsaAndAesServiceImpl implements CryptService {

    private final CryptionProperties cryptionProperties;

    public RsaAndAesServiceImpl(CryptionProperties cryptionProperties) throws Exception {
        this.cryptionProperties = cryptionProperties;
        KeyPair keyPair = RSAUtil.generateKeyPair();
        cryptionProperties.setPrivateKey(keyPair.getPrivate());
        cryptionProperties.setPublicKey(keyPair.getPublic());
    }

    /**
     * 加密
     * @param input 输入明文
     * @return
     */
    @Override
    public String encrypt(String input) throws Exception {
        // 初始化动态AES密钥
        this.initAesKey();
        // 使用AES加密内容
        String encrypt = AesGcmUtil.encrypt(cryptionProperties.getKey(), input);
        // 使用RSA加密AES密钥
        cryptionProperties.setKey(RSAUtil.encrypt(cryptionProperties.getKey(), cryptionProperties.getPublicKey()));
        return encrypt;
    }

    @Override
    public String decrypt(String input) {
        try {
            // 使用RSA解密AES密钥
            String aesKey = RSAUtil.decrypt(cryptionProperties.getKey(), cryptionProperties.getPrivateKey());
            // 使用AES解密内容
            return AesGcmUtil.decrypt(aesKey, input);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 初始化AES密钥
     * @throws Exception 密钥生成失败
     */
    private void initAesKey() throws Exception {
        cryptionProperties.setKey(AesGcmUtil.generateKey());
    }
}
